package com.sumainfor.pc.market.service;

import com.alibaba.fastjson.JSON;
import com.sumainfor.common.entity.TemplateData;
import com.sumainfor.common.util.*;
import com.sumainfor.common.utlis.HtmlUtil;
import com.sumainfor.common.utlis.Jsapi_ticketUtil;
import com.sumainfor.common.utlis.ParamsCommon;
import com.sumainfor.common.wechat.WeChatConfig;
import com.sumainfor.pc.market.dao.*;
import com.sumainfor.pc.market.feign.Zfeign.ZpcGmioFeign;
import com.sumainfor.pc.market.feign.ZuulFeign.ZuulFeign;
import com.sumainfor.pc.market.service.tenant.SignedProviderService;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.awt.*;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 服务中心经理审核签约的合同
 */
@Service
public class SePactTemplateService {
    private ReentrantLock lock = new ReentrantLock(false);
    Logger log= LoggerFactory.getLogger(CommunityService.class);
    @Autowired
    private SePactTemplateMapper sePactTemplateMapper;
    @Autowired
    private SignedProviderService signedProviderService;
    @Autowired
    private UtilsMapper utilsMapper;
    @Autowired
    private ZpcGmioFeign zpcGmioFeign;
    @Autowired
    private RdPactMapper rdPactMapper;
    @Autowired
    private RdHousingInfoMapper rdHousingInfoMapper;
    @Autowired
    private RdHousingShelfMapper rdHousingShelfMapper;

    @Autowired
    ZuulFeign ZuulFeign;

    String UUID=null;
    /**
     * 根据合同编号查询合同模板的信息
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult updateSePactTemplate(Map<String,Object> params){
        JsonResult result=new JsonResult();
        /**
         * 加锁操作
         */
        lock.lock();
        try{
            try {
                if (params.get("Ncount")==null || params.get("PaId")==null
                        || params.get("sameCityCount")==null || params.get("sThoCount")==null){
                    log.info("参数不正确");
                    return result.putFailed("参数不正确");
                }
                Map<String,Object> map=new HashMap<String,Object>();
                //Ncount 0拒绝 1通过
                if (params.get("Ncount").toString().equals("1")){
                    //根据合同编号查询到对应的合同模板编号
                    map=sePactTemplateMapper.getSePactTemplate(params);
                    //调用生成电子合同的方法
                    JsonResult resultTen=signedProviderService.createPact(map);
                    System.out.println("JsonResult:"+resultTen);
                    if(resultTen.get("errorCode").toString().equals("0")){//返回电子合同模板
                       /* //调用生成账单
                        Map<String,Object> gmioMap=new HashMap<String,Object>();
                        gmioMap.put("HouId",params.get("HouId"));
                        gmioMap.put("HouInfoId",params.get("HouInfoId"));
                        gmioMap.put("TenId",map.get("TenId"));
                        gmioMap.put("payYa",map.get("payYa"));
                        gmioMap.put("Pmethod",params.get("Pmethod"));
                        gmioMap.put("PaId",params.get("PaId"));
                        gmioMap.put("CorId",params.get("CorId"));
                        gmioMap.put("WaDeposit",params.get("WaDeposit"));
                        gmioMap.put("bottomADate",map.get("bottomADate"));
                        gmioMap.put("monthMoney",map.get("monthMoney"));
                        gmioMap.put("payFu",map.get("payFu"));
                        JsonResult gmioResult=zpcGmioFeign.addTenantBillForPact(gmioMap);
                        System.out.println("返回参数运营部:"+gmioResult);
                        if (!gmioResult.get("errorCode").toString().equals("0")){
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return result.putFailed("服务器繁忙");
                        }*/
                        Map<String,Object> tenMap=(Map<String,Object>)resultTen.get("result");
                        tenMap.put("PaId",params.get("PaId"));
                        tenMap.put("by", ContextUtils.getUserId());//操作人
                        tenMap.put("term", "2");// 更新端 Update端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                        tenMap.put("fnc",
                                this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                        ParamsCommon.commonUpdateParms(tenMap);
                        //修改合同的审核状态
                        tenMap.put("AuditId",ContextUtils.getUserId());//审核人编号
                        tenMap.put("AuditTime",tenMap.get("updtm"));//审核人编号
                        tenMap.put("AuditStatus","1");//审核状态（0待审核 1审核通过 2审核不通过）
                        rdPactMapper.updatePact(tenMap);//修改合同信息
                        //修改房源状态为已经签约
                        Map<String,Object> houMap=new HashMap<String,Object>();
                        houMap.put("State",2);//房源状态（0 可预销 1可签约 2已签约 ）
                        houMap.put("HouInfoId",params.get("HouInfoId"));//房源详表的编号
                        houMap.put("HouId",params.get("HouId"));//房源主表的编号
                        houMap.put("ProOperaType",params.get("ProOperaType"));//房源的租赁类型
                        houMap.put("by", ContextUtils.getUserId());//操作人
                        houMap.put("term", "2");// 更新端 Update端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                        houMap.put("fnc",
                                this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                        ParamsCommon.commonUpdateParms(map);
                        //修改房源状态为已签约
                        System.out.println("修改的时候的参数:"+houMap);
                        //租赁类型（1.合租 2.整租）
                        if (params.get("ProOperaType").toString().equals("1")){
                            houMap.put("ifHouInfoId",1);
                        }else{
                            houMap.put("ifHouId",1);
                        }
                        Integer houCount=rdHousingInfoMapper.updateHousingStateHouInfo(houMap);
                        houMap.put("State",0);//房源状态（0 待上架 1可签约 2已签约 ）
                        //如果是签约的房子是合租的房源就把整租的房源下架
                        Integer houCount2=0;
                        if (params.get("ProOperaType").toString().equals("1")){
                            houCount2=rdHousingInfoMapper.updateHouStateHouInfo(houMap);
                        }else{
                            houCount2=1;
                        }
                        if (houCount>0 && houCount2>0){
                            //修改内部房源在第三方平台房源状态
                            Integer sameCityCount=(Integer)params.get("sameCityCount");//58 是否已经发布
                            Integer sThoCount=(Integer)params.get("sThoCount");//该房间的整租房源是否在58发布过
                            //58 第三方上架状态 0 待上架 1可签约 2已签约
                            if (sameCityCount>0 && params.get("stPrimaryStatus").toString().equals("1")){
                                //修改第三房源为下架
                                params.put("PrimaryStatus","0");//第三方上架状态 0 待上架 1可签约 2已签约
                                params.put("SheId",params.get("stSheId"));//58 第三方上架表主键
                                Integer shelfCount=rdHousingShelfMapper.upRdHs(params);
                                if (shelfCount!=null && shelfCount>0){
                                    //如果58被选中就让房源在58那里下架s
                                    Map<String,Object> dataMap=new HashMap<String,Object>();
                                    dataMap.put("appId", InteSameCityConfig.APPID_TEST);
                                    dataMap.put("houseId",params.get("stPrimaryKey"));//内部房源在58平台的唯一标识
                                    dataMap.put("status","4000");//房屋修改状态，枚举值 3000 上线 4000:下线 5000:已出租
                                    //请求体
                                    Map<String,String> maphead=new HashMap<String,String>();
                                    //组装请求接口的map类型参数 转成json 然后生成加密字符串
                                    String rsaString= ThirdRSACoder.encrypt(JSON.toJSONString(dataMap),InteSameCityConfig.PRIVATE_KEY);
                                    maphead.put("data",rsaString);
                                    //请求58的修改房源状态接口
                                    Map<String,Object> sameShellResult= InteSameCityUtil.api_house_info_get(maphead);
                                    //租赁类型（1.合租 2.整租）
                                    if (params.get("ProOperaType").toString().equals("1") && sThoCount >0 && params.get("sThoPrimaryStatus").equals("1")){
                                        dataMap.put("houseId",params.get("sThoPrimaryKey"));//内部房源在58的唯一标识
                                        rsaString=ThirdRSACoder.encrypt(JSON.toJSONString(dataMap),InteSameCityConfig.PRIVATE_KEY);
                                        maphead.put("data",rsaString);
                                        Map<String,Object> sThoResult=InteSameCityUtil.api_house_info_get(maphead);
                                        if (sThoResult.get("code").toString().equals("0")){
                                            result.putSuccess("下架成功");
                                        }else{
                                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                            result.putFailed("服务器繁忙");
                                        }
                                    }
                                    if (sameShellResult.get("code").toString().equals("0")){
                                        result.putSuccess("下架成功");
                                    }else{
                                        result.putFailed("服务器繁忙");
                                    }
                                }
                            }
                            //推送微信模板
                            Map<String, TemplateData> param = new HashMap<>();
                            param.put("first", new TemplateData("唐巢公寓温馨提示：尊敬的租客，您与我司签的租赁合同已签约成功。请您确认信息是否正确？如有异议，请联系您的租赁顾问人员为您服务。\n", "#4876FF"));
                            param.put("keyword1", new TemplateData(map.get("payYaMoney").toString()+"元", "#4876FF"));
                            param.put("keyword2", new TemplateData(map.get("payFu").toString()+"个月", "#4876FF"));
                            BigDecimal sumMoney=new BigDecimal(params.get("payYaMoney").toString()).multiply(new BigDecimal(params.get("payFu").toString()));//租金合计
                            param.put("keyword3", new TemplateData(sumMoney+"元", "#4876FF"));
                            String PmethodName="月付";
                            if (String.valueOf(params.get("Pmethod")).equals("0")){
                                PmethodName="月付";
                            }else if (String.valueOf(params.get("Pmethod")).equals("1")){
                                PmethodName="季付";
                            }else if (String.valueOf(params.get("Pmethod")).equals("2")){
                                PmethodName="半年付";
                            }else if (String.valueOf(params.get("Pmethod")).equals("3")){
                                PmethodName="年付";
                            }
                            param.put("keyword4", new TemplateData(PmethodName, "#4876FF"));
                            System.out.println("param:"+JSONObject.fromObject(param));
                            Jsapi_ticketUtil.sendTemplate(map.get("openid").toString(),WeChatConfig.TEMPLATE_ID,"http://www.4006269069.net/#/staySigning?pactId="+params.get("PaId"),"#4876FF", JSONObject.fromObject(param));
                            result.putSuccess("操作成功");
                            //签约成功通知
                            CustomMap data = CustomMap.create("MeType", 3)
                                    .put("Title", "签约成功")
                                    .put("Content", HtmlUtil.stringToHTML(String.format("恭喜！您的合同（%s） 签约成功，继续加油吧！；",params.get("PaId")), "", Color.blue))
                                    .put("by", ContextUtils.getUserId())
                                    .put("term", 2);
                            ZuulFeign.AddMessage(data);

                        }else{
                            result.putFailed("服务器繁忙");
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        }
                    }else{//如果电子合同返回的状态码异常就不去新增合同主表
                        log.info("合同模板创建异常");
                        result.putFailed("合同模板创建异常");
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }else if (params.get("Ncount").toString().equals("0")){
                    Map<String,Object> tenMap=new HashMap<String, Object>();
                    tenMap.put("PaId",params.get("PaId"));
                    tenMap.put("by", ContextUtils.getUserId());//操作人
                    tenMap.put("term", "2");// 更新端 Update端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    tenMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonUpdateParms(tenMap);
                    //修改合同的审核状态
                    tenMap.put("AuditId",ContextUtils.getUserId());//审核人编号
                    tenMap.put("AuditTime",tenMap.get("updtm"));//审核人编号
                    tenMap.put("AuditStatus","2");//审核状态（0待审核 1审核通过 2审核不通过）
                    rdPactMapper.updatePact(tenMap);//修改合同信息
                    result.putSuccess("操作成功");
                }else{
                    result.putFailed("参数异常");
                }

            } catch (Exception e) {
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                result.putFailed("服务器繁忙");
            }
        }
        finally {
            lock.unlock();
        }
        return result;
    }
}
